﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Xml.Serialization;
using Libreria.SICOM.Modelo;
using Libreria.SICOM.Negocio;
using MySql.Data.MySqlClient;


namespace MeshliumImportarDatos
{
    class Program
    {
        private static Thread hilo;
        static void Main(string[] args)
        {
            hilo = new Thread(ImportarDatos);
            hilo.Start();
        }

        private static void ImportarDatos()
        {
            // Primer paso obtener la información del info.xml
            Info informacion = new Info(true);

            string connectionString = ConfigurationManager.ConnectionStrings["Meshlium"].ConnectionString; //connection string
            string dataTableName = "zigbee_data_proy";
            Int32 tipoLugarG;
            Int32.TryParse(ConfigurationManager.AppSettings["tipoLugarGenerico"], out tipoLugarG);
            Int32 unidadG;
            Int32.TryParse(ConfigurationManager.AppSettings["unidadGenerica"], out unidadG);

            try
            {
                MySqlConnection mySqlConnection = new MySqlConnection(connectionString);  //creates connection
                string selectString = "Select * FROM " + dataTableName;  //selects fields to be accessed                    
                if (informacion.Id > 0)
                {
                    selectString += " Where id_registro> " + informacion.Id.ToString();  //selects fields to be accessed                    
                }
                selectString += " Order by 1";  //selects fields to be accessed                    

                MySqlCommand mySqlCommand = mySqlConnection.CreateCommand();
                mySqlCommand.CommandText = selectString;
                MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter();
                mySqlDataAdapter.SelectCommand = mySqlCommand;
                mySqlConnection.Open();   // opens connection

                DataSet meshliumDataSet = new DataSet();  //creates data set
                mySqlDataAdapter.Fill(meshliumDataSet, dataTableName);
                DataTable myDataTable = meshliumDataSet.Tables[dataTableName];  //i get an error here

                MuestraNegocio muestra = new MuestraNegocio();
                String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
                String prefijo = ConfigurationManager.AppSettings["prefijo"];
                foreach (DataRow myDataRow in myDataTable.Rows)  //iterates over rows in table
                {
                    String identificador = prefijo + myDataRow["id_registro"].ToString();
                    int tipoMuestra;
                    Int32.TryParse(myDataRow["tipo_muestra_id"].ToString(), out tipoMuestra);
                    int proyecto;
                    Int32.TryParse(myDataRow["proy_id"].ToString(), out proyecto);
                    int lugar;
                    Int32.TryParse(myDataRow["lugar_id"].ToString(), out lugar);
                    DateTime fecha;
                    DateTime.TryParse(myDataRow["fecha"].ToString(), out fecha);
                    int responsable = 0;
                    String mac = myDataRow["mac"].ToString();
                    int equipo;
                    Int32.TryParse(myDataRow["equipo_medicion"].ToString(), out equipo);
                    int variable;
                    Int32.TryParse(myDataRow["var_id"].ToString(), out variable);
                    String valor = myDataRow["valor"].ToString();

                    TipodeMuestraNegocio tpn = new TipodeMuestraNegocio();
                    TipodeMuestra tp = tpn.consultarPorIdentificador(tipoMuestra, cdc);
                    if (tp == null)
                    {
                        tpn.crearTipodeMuestra(tipoMuestra, "", "", cdc);
                    }

                    ProyectoNegocio pn = new ProyectoNegocio();
                    Proyecto p = pn.ConsultarPorIdentificador(proyecto, cdc);
                    if(p == null )
                    {
                        pn.CrearProyecto(proyecto, "", cdc);
                    }

                    LugarNegocio ln = new LugarNegocio();
                    Lugar l = ln.ConsultarPorIdentificador(lugar, cdc);
                    if (l == null)
                    {
                        ln.CrearLugar(lugar, "", "", "", "", "","","", tipoLugarG, cdc);
                    }

                    EquipodeMedicionNegocio emn = new EquipodeMedicionNegocio();
                    EquipodeMedicion em = emn.consultarPorIdentificador(equipo, cdc);
                    if (em == null)
                    {
                        emn.crearEquipodeMedicion(equipo, "", true, false, "", cdc);
                    }

                    VariableNegocio vn = new VariableNegocio();
                    Variable v = vn.ConsultarPorIdentificador(variable, cdc);
                    if (v == null )
                    {
                        vn.CrearVariable(variable, "", unidadG, cdc);
                    }

                    muestra.CrearMuestra(identificador, tipoMuestra, proyecto, lugar, fecha, responsable, mac, equipo, variable, valor, cdc);

                    int id;
                    int.TryParse(myDataRow["id_registro"].ToString(), out id);
                    informacion.Id = id;
                    informacion.Fecha = fecha;
                }

                mySqlConnection.Close();  //close connection
                informacion.guardarXML();
            }
            catch (Exception e)
            {
                mensajeDeError("Error al importar datos de Meshlium: ", e);
            }

            int lapso;
            int.TryParse(ConfigurationManager.AppSettings["lapsoDeCarga"], out lapso);
            Thread.Sleep(lapso * 60 * 1000);
            ImportarDatos();
        }

        private static void mensajeDeError(String mensaje, Exception e)
        {
            String rutaArchivo = @".\info.log";
            TextWriter textWriter = new StreamWriter(rutaArchivo);
            while (e.InnerException != null)
            {
                mensaje += "\n" + e.Message;
                e = e.InnerException;
            }
            textWriter.Write(mensaje);
            textWriter.Close();
        }

    }
}

public class Info
{
    private String rutaArchivo = @".\info.xml";
    public Int32 Id { get; set; }
    public DateTime Fecha { get; set; }

    public Info()
    {
        
    }

    public Info(Boolean importar)
    {
        if (importar)
        {
            this.importarDatos();
        }
    }

    public void guardarXML()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Info));
        TextWriter textWriter = new StreamWriter(this.rutaArchivo);
        serializer.Serialize(textWriter, this);
        textWriter.Close();
    }

    private void importarDatos()
    {
        if (File.Exists(this.rutaArchivo))
        {
            XmlSerializer deserializer = new XmlSerializer(typeof (Info));
            TextReader textReader = new StreamReader(this.rutaArchivo);
            Info infoTemporal = new Info(false);
            infoTemporal = (Info) deserializer.Deserialize(textReader);
            if (infoTemporal != null)
            {
                this.Id = infoTemporal.Id;
                this.Fecha = infoTemporal.Fecha;
            }
        }
    }
}